#include "ListEnsComp.h"

using namespace std;

/**
 * Constructeur par défaut. Crée un ensemble anonyme, sans coût ni
 * membres.
 */
ListEnsComp::ListEnsComp()
  : ListComp(), NumeroPrerequis( 0 ), NumeroRacesAdmises( 0 ),
    ChoixPrealable( false )
{}

/**
 * Constructeur standard, qui initialise une instance qui ne possède
 * aucune restrictions quant aux modifications que l'on peut apporter
 * à la sélections des compétences de classe.
 *
 * @param nom nom de l'ensemble.
 * @param prix coût de l'ensemble.
 * @param membres liste des compétences incluses dans l'ensemble.
 * @param numRaces indice des races admises pour l'ensemble.
 * @param numPrerequis indice des prérequis pour l'ensemble.
 * @param oblig force la sélection d'un ensemble lors de la création
 * si \e true.
 */
ListEnsComp::ListEnsComp(const string& nom, const unsigned int& prix,
			 const vector< unsigned int >& membres,
			 const unsigned int& numRaces,
			 const unsigned int& numPrerequis, const bool& oblig)
  : ListComp( nom, prix ), NumeroPrerequis( numPrerequis ),
    NumeroRacesAdmises( numRaces ), ChoixPrealable( oblig )
{
  Membres.assign( membres.begin(), membres.end() );
}

/**
 * Constructeur permettant de limiter (partiellement ou totalement)
 * les modifications postérieures à la sélection de l'ensemble de
 * compétences.
 *
 * @param nom nom de l'ensemble.
 * @param prix coût de l'ensemble.
 * @param membres liste des compétencess incluses dans l'ensemble.
 * @param exclus liste des compétences dont l'état n'est plus modifiable
 * une fois la sélection effectuée.
 * @param numRaces indice des races admises pour l'ensemble.
 * @param numPrerequis indice des prérequis pour l'ensemble.
 * @param oblig force la sélection d'un ensemble lors de la création
 * si \e true.
 */
ListEnsComp::ListEnsComp(const string& nom, const unsigned int& prix,
			 const vector< unsigned int >& membres,
			 const vector< unsigned int >& exclus,
			 const unsigned int& numRaces,
			 const unsigned int& numPrerequis, const bool& oblig)
  : ListComp( nom, prix ), NumeroPrerequis( numPrerequis ),
    NumeroRacesAdmises( numRaces ), ChoixPrealable( oblig )
{
  Membres.assign( membres.begin(), membres.end() );
  Exclus.assign( exclus.begin(), exclus.end() );
}

/**
 * Constructeur de copie, permet de dupliquer une instance.
 *
 * @param lsEnsComp instance à copier.
 */
ListEnsComp::ListEnsComp(const ListEnsComp& lsEnsComp)
  : ListComp( lsEnsComp ), NumeroPrerequis( lsEnsComp.NumeroPrerequis ),
    NumeroRacesAdmises( lsEnsComp.NumeroRacesAdmises ),
    ChoixPrealable( lsEnsComp.ChoixPrealable )
{
  Membres.assign( lsEnsComp.Membres.begin(), lsEnsComp.Membres.end() );
  Exclus.assign( lsEnsComp.Exclus.begin(), lsEnsComp.Exclus.end() ); 
}

/**
 * Le destructeur n'a rien de spécial à faire.
 */
ListEnsComp::~ListEnsComp()
{}

/**
 * Opérateur d'affectation, permet de copier une instance dans une
 * autre.
 *
 * @param lsEnsComp instance à copier.
 * @return une référence constance sur l'instance courante.
 */
const ListEnsComp& ListEnsComp::operator=(const ListEnsComp& lsEnsComp)
{
  Comp = lsEnsComp.Comp;
  Cout = lsEnsComp.Cout;
  Membres.assign( lsEnsComp.Membres.begin(), lsEnsComp.Membres.end() );
  Exclus.assign( lsEnsComp.Exclus.begin(), lsEnsComp.Exclus.end() );
  NumeroPrerequis    = lsEnsComp.NumeroPrerequis;
  NumeroRacesAdmises = lsEnsComp.NumeroRacesAdmises;
  ChoixPrealable     = lsEnsComp.ChoixPrealable;

  return *this;
}

/**
 * Permet de récupérer un pointeur sur la liste des compétences
 * incluses.
 *
 * @return un pointeur sur Membres.
 */
const vector< unsigned int >* ListEnsComp::membres() const
{
  return &Membres;
}

/**
 * Permet de récupérer un pointeur sur la liste des compétences
 * "gelées".
 *
 * @return un pointeur sur Exclus.
 */
const vector< unsigned int >* ListEnsComp::exclus() const
{
  return &Exclus;
}

/**
 * Permet de récupérer le numéro d'ensembles de prérequis à appliquer.
 *
 * @return une référence constance sur NumeroPrerequis.
 */
const unsigned int& ListEnsComp::numeroPrerequis() const
{
  return NumeroPrerequis;
}

/**
 * Permet de récupérer le numéro d'ensembles de races admises.
 *
 * @return une référence constance sur NumeroRacesAdmises.
 */
const unsigned int& ListEnsComp::numeroRaces() const
{
  return NumeroRacesAdmises;
}

/**
 * Permet de savoir si le choix d'un ensemble est obligatoire (comme
 * pour les spécialistes) ou optionnel.
 *
 * @return \e true si le choix est obligatoire, \e false sinon.
 */
const bool& ListEnsComp::choixPrealable() const
{
  return ChoixPrealable;
}
